package com.java.util;

import com.java.util.pojo.User;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;


/**
 * List集合先根据A排序，再根据B排序，再根据C排序
 */
public class ListSortSortSort {

    public static void main(String[] args) throws InterruptedException {
        List<User> list = new ArrayList<>();

        List<LocalDateTime> timeList = new ArrayList<>();

        for (int i = 0; i < 10; i++) {
            Thread.sleep(1000);
            timeList.add(LocalDateTime.now());
        }

        list.add(new User(1001, "c", "0", 1, true, timeList.get(3)));
        list.add(new User(1002, "c", "1", 2, false, timeList.get(4)));
        list.add(new User(2001, "c", "0", null, false, timeList.get(1)));
        list.add(new User(2003, "c", "0", null, false, timeList.get(6)));
        list.add(new User(3002, "c", "1", null, false, timeList.get(2)));
        list.add(new User(4002, "c", "1", null, false, timeList.get(0)));
        list.add(new User(5002, "c", "1", null, false, timeList.get(8)));
        list.forEach(System.out::println);
        System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

        // 先根据 getAssetId排序，如果 getAssetId 为空则根据city排序，null排序放在最后Comparator.nullsLast
        /*List<User> collect = list.stream()
                .sorted(Comparator.comparing(User::getAssetId, Comparator.nullsLast(Integer::compareTo))
                        .thenComparing(User::getCity, Comparator.nullsLast(String::compareTo))
                        // 这个会按照time对前面基于getAssetId、getCity排好的结果进行降序排列，对整体排序
                        .thenComparing(User::getTime).reversed()
                )
                .collect(Collectors.toList());*/

        /*List<User> collect = list.stream()
                .sorted(Comparator.comparing(
                        // 这里假设 getAssetId() 返回 Integer
                        User::getAssetId,
                        // 对 null 进行处理，放在最后
                        Comparator.nullsLast(Integer::compareTo)
                ).thenComparing(
                        // 当 name 非空时比较 city，name 为空时不应该再比较 name（因为已经比较过 null 了）
                        user -> user.getAssetId() != null ? user.getCity() : null,
                        // 对 city 的 null 进行处理
                        Comparator.nullsLast(String::compareTo)
                ).thenComparing(
                        // 如果前面的比较都相同，则按 city 排序（注意：这里可能会与上面的逻辑重复，取决于你的具体需求）
                        User::getCity,
                        // 再次对 city 的 null 进行处理（如果 getCity() 可能返回 null）
                        Comparator.nullsLast(String::compareTo)
                ).thenComparing(
                        // 仅对 time 进行降序排序
                        (o1, o2) -> o2.getTime().compareTo(o1.getTime()))
                )
                .collect(Collectors.toList());*/



        List<User> collect = list.stream()
                .sorted(
                        // 先根据getAssetId 升序排序，null放最后
                        Comparator.comparing(User::getAssetId, Comparator.nullsLast(Integer::compareTo))
                         // 当 getAssetId 相同时，按照 getCity 升序排列，null放最后
                        .thenComparing(User::getCity, Comparator.nullsLast(String::compareTo))
                         // 当 getAssetId 及 getCity相同时，按照 time降序排列
                         // .thenComparing(Comparator.comparing(User::getTime)) 升序排序
                        .thenComparing((o1, o2) -> o2.getTime().compareTo(o1.getTime()))
                )
                .collect(Collectors.toList());
        collect.forEach(System.out::println);


    }
}
